<?php

// +----------------------------------------------------------------------

// | OneThink [ WE CAN DO IT JUST THINK ]

// +----------------------------------------------------------------------

// | Copyright (c) 2013 http://www.onethink.cn All rights reserved.

// +----------------------------------------------------------------------

// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )

// +----------------------------------------------------------------------

// | Author: liu21st <liu21st@gmail.com>

// +----------------------------------------------------------------------



namespace Common\Api;

class ModelApi {

    /**

     * 获取文档模型信息

     * @param  integer $id    模型ID

     * @param  string  $field 模型字段

     * @return array

     */

    public static function get_document_model($id = null, $field = null){

        static $list;



        /* 非法分类ID */

        if(!(is_numeric($id) || is_null($id))){

            return '';

        }



        /* 读取缓存数据 */

        if(empty($list)){

            $list = S('DOCUMENT_MODEL_LIST');

        }



        /* 获取模型名称 */

        if(empty($list)){

            $map   = array('status' => 1, 'extend' => 1);

            $model = M('Model')->where($map)->field(true)->select();

            foreach ($model as $value) {

                $list[$value['id']] = $value;

            }

            S('DOCUMENT_MODEL_LIST', $list); //更新缓存

        }



        /* 根据条件返回数据 */

        if(is_null($id)){

            return $list;

        } elseif(is_null($field)){

            return $list[$id];

        } else {

            return $list[$id][$field];

        }

    }



    // 获取模型名称

    public static function get_model_by_id($id){

        return $model = M('Model')->getFieldById($id,'title');

    }



    /**

     * 获取属性信息并缓存

     * @param  integer $id    属性ID

     * @param  string  $field 要获取的字段名

     * @return string         属性信息

     */

    public static function get_model_attribute($model_id, $group = true){

        static $list;



        /* 非法ID */

        if(empty($model_id) || !is_numeric($model_id)){

            return '';

        }



        /* 读取缓存数据 */

        if(empty($list)){

            $list = S('attribute_list');

        }



        /* 获取属性 */

        if(!isset($list[$model_id])){

            $map = array('model_id'=>$model_id);

            $extend = M('Model')->getFieldById($model_id,'extend');



            if($extend){

                $map = array('model_id'=> array("in", array($model_id, $extend)));

            }

            $info = M('Attribute')->where($map)->select();

            $list[$model_id] = $info;

            //S('attribute_list', $list); //更新缓存

        }



        $attr = array();

        foreach ($list[$model_id] as $value) {

            $attr[$value['id']] = $value;

        }



        if($group){

            $sort  = M('Model')->getFieldById($model_id,'field_sort');



            if(empty($sort)){	//未排序

                $group = array(1=>array_merge($attr));

            }else{

                $group = json_decode($sort, true);



                $keys  = array_keys($group);

                foreach ($group as &$value) {

                    foreach ($value as $key => $val) {

                        $value[$key] = $attr[$val];

                        unset($attr[$val]);

                    }

                }



                if(!empty($attr)){

                    $group[$keys[0]] = array_merge($group[$keys[0]], $attr);

                }

            }

            $attr = $group;

        }

        return $attr;

    }



    // 分析属性的枚举类型字段值 格式 a:名称1,b:名称2 或者 :fun(var1,var)

    public static function parse_field_attr($string) {

        if(0 === strpos($string,':')){

            // 采用函数定义

            return   eval(substr($string,1).';');

        }

        $array = preg_split('/[,;\r\n]+/', trim($string, ",;\r\n"));

        if(strpos($string,':')){

            $value  =   array();

            foreach ($array as $val) {

                list($k, $v) = explode(':', $val);

                $value[$k]   = $v;

            }

        }else{

            $value  =   $array;

        }

        return $value;

    }

}